{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pickle\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import os\n",
    "from collections import defaultdict\n",
    "import matplotlib.pyplot as plt\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "wrist_ACC: (2930, 3, 32)\n",
      "wrist_BVP: (2930, 1, 64)\n",
      "wrist_EDA: (2930, 1, 4)\n",
      "wrist_TEMP: (2930, 1, 4)\n",
      "chest_ACC: (2930, 3, 700)\n",
      "chest_ECG: (2930, 1, 700)\n",
      "chest_EMG: (2930, 1, 700)\n",
      "chest_EDA: (2930, 1, 700)\n",
      "chest_Temp: (2930, 1, 700)\n",
      "chest_Resp: (2930, 1, 700)\n"
     ]
    }
   ],
   "source": [
    "with open(\"WESAD/S3/S3_n0.pkl\", 'rb') as file:\n",
    "    data = pickle.load(file, encoding='bytes')\n",
    "for device in ['wrist', 'chest']:\n",
    "    for sensor in data[device]:\n",
    "        print(f'{device}_{sensor}: {data[device][sensor].shape}')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Data of S2 loaded!\n",
      "Data of S3 loaded!\n",
      "Data of S4 loaded!\n",
      "Data of S5 loaded!\n",
      "Data of S6 loaded!\n",
      "Data of S7 loaded!\n",
      "Data of S8 loaded!\n",
      "Data of S9 loaded!\n",
      "Data of S10 loaded!\n",
      "Data of S11 loaded!\n",
      "Data of S13 loaded!\n",
      "Data of S14 loaded!\n",
      "Data of S15 loaded!\n",
      "Data of S16 loaded!\n",
      "Data of S17 loaded!\n"
     ]
    }
   ],
   "source": [
    "# Creating dataframe of all of them\n",
    "# `window` | `mean` | `std` | `max` | `min` | `label`\n",
    "\n",
    "from feature import extract_features\n",
    "\n",
    "extract_features(verbose=1)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing S2\n",
      "test #S2 skipped\n",
      "\n",
      "input of size (42069, 6)\n",
      "Training RandomForestClassifier() completed in 48.474334955215454 secs (score=0.7925797662887943)\n",
      "Training MLPClassifier() completed in 43.78752422332764 secs (score=0.5353593643641084)\n",
      "predicting df of size (2889, 5), made (2889,)\n",
      "Report of S2: {'2': {'precision': 0.8801955990220048, 'recall': 0.5853658536585366, 'f1-score': 0.703125, 'support': 615}, '3': {'precision': 0.8971774193548387, 'recall': 0.9784520668425681, 'f1-score': 0.9360538493899875, 'support': 2274}, 'accuracy': 0.894773277950848, 'macro avg': {'precision': 0.8886865091884217, 'recall': 0.7819089602505523, 'f1-score': 0.8195894246949937, 'support': 2889}, 'weighted avg': {'precision': 0.8935623901043394, 'recall': 0.894773277950848, 'f1-score': 0.886468787993365, 'support': 2889}}\n",
      "Testing S3\n",
      "test #S3 skipped\n",
      "\n",
      "input of size (42023, 6)\n",
      "Training RandomForestClassifier() completed in 54.44404602050781 secs (score=0.7964324970362877)\n",
      "Training MLPClassifier() completed in 45.557555198669434 secs (score=0.5922068807119566)\n",
      "predicting df of size (2935, 5), made (2935,)\n",
      "Report of S3: {'2': {'precision': 1.0, 'recall': 0.5625, 'f1-score': 0.72, 'support': 640}, '3': {'precision': 0.8912621359223301, 'recall': 1.0, 'f1-score': 0.9425051334702258, 'support': 2295}, 'accuracy': 0.9045996592844975, 'macro avg': {'precision': 0.945631067961165, 'recall': 0.78125, 'f1-score': 0.8312525667351129, 'support': 2935}, 'weighted avg': {'precision': 0.9149732885661832, 'recall': 0.9045996592844975, 'f1-score': 0.8939861265124934, 'support': 2935}}\n",
      "Testing S4\n",
      "test #S4 skipped\n",
      "\n",
      "input of size (41988, 6)\n",
      "Training RandomForestClassifier() completed in 55.636016845703125 secs (score=0.8072915938366891)\n",
      "Training MLPClassifier() completed in 46.71273136138916 secs (score=0.5686435901747865)\n",
      "predicting df of size (2970, 5), made (2970,)\n",
      "Report of S4: {'2': {'precision': 0.5578800557880056, 'recall': 0.6299212598425197, 'f1-score': 0.591715976331361, 'support': 635}, '3': {'precision': 0.8956946293830448, 'recall': 0.8642398286937901, 'f1-score': 0.8796861377506537, 'support': 2335}, 'accuracy': 0.8141414141414142, 'macro avg': {'precision': 0.7267873425855251, 'recall': 0.747080544268155, 'f1-score': 0.7357010570410074, 'support': 2970}, 'weighted avg': {'precision': 0.823468281156496, 'recall': 0.8141414141414142, 'f1-score': 0.8181167598041046, 'support': 2970}}\n",
      "Testing S5\n",
      "test #S5 skipped\n",
      "\n",
      "input of size (41947, 6)\n",
      "Training RandomForestClassifier() completed in 52.36353158950806 secs (score=0.8088790032094405)\n",
      "Training MLPClassifier() completed in 60.37564444541931 secs (score=0.549971132463254)\n",
      "predicting df of size (3011, 5), made (3011,)\n",
      "Report of S5: {'2': {'precision': 0.5472392638036809, 'recall': 0.6914728682170542, 'f1-score': 0.610958904109589, 'support': 645}, '3': {'precision': 0.9093806921675774, 'recall': 0.8440405748098055, 'f1-score': 0.8754932047347654, 'support': 2366}, 'accuracy': 0.811358352706742, 'macro avg': {'precision': 0.7283099779856292, 'recall': 0.7677567215134299, 'f1-score': 0.7432260544221772, 'support': 3011}, 'weighted avg': {'precision': 0.8318047302629897, 'recall': 0.811358352706742, 'f1-score': 0.8188261094497309, 'support': 3011}}\n",
      "Testing S6\n",
      "test #S6 skipped\n",
      "\n",
      "input of size (41969, 6)\n",
      "Training RandomForestClassifier() completed in 52.84859561920166 secs (score=0.8033373567356599)\n",
      "Training MLPClassifier() completed in 53.31463956832886 secs (score=0.5114351382166007)\n",
      "predicting df of size (2989, 5), made (2989,)\n",
      "Report of S6: {'2': {'precision': 1.0, 'recall': 0.42153846153846153, 'f1-score': 0.593073593073593, 'support': 650}, '3': {'precision': 0.8615101289134438, 'recall': 1.0, 'f1-score': 0.925603482390186, 'support': 2339}, 'accuracy': 0.8742054198728672, 'macro avg': {'precision': 0.930755064456722, 'recall': 0.7107692307692308, 'f1-score': 0.7593385377318895, 'support': 2989}, 'weighted avg': {'precision': 0.8916266950580611, 'recall': 0.8742054198728672, 'f1-score': 0.8532901909697157, 'support': 2989}}\n",
      "Testing S7\n",
      "test #S7 skipped\n",
      "\n",
      "input of size (41970, 6)\n",
      "Training RandomForestClassifier() completed in 51.078453540802 secs (score=0.8052658281806488)\n",
      "Training MLPClassifier() completed in 82.62607336044312 secs (score=0.5272238517196958)\n",
      "predicting df of size (2988, 5), made (2988,)\n",
      "Report of S7: {'2': {'precision': 0.7583732057416268, 'recall': 0.990625, 'f1-score': 0.859078590785908, 'support': 640}, '3': {'precision': 0.9972118959107806, 'recall': 0.91396933560477, 'f1-score': 0.9537777777777777, 'support': 2348}, 'accuracy': 0.9303882195448461, 'macro avg': {'precision': 0.8777925508262037, 'recall': 0.952297167802385, 'f1-score': 0.9064281842818429, 'support': 2988}, 'weighted avg': {'precision': 0.9460550144823141, 'recall': 0.9303882195448461, 'f1-score': 0.9334941500419021, 'support': 2988}}\n",
      "Testing S8\n",
      "test #S8 skipped\n",
      "\n",
      "input of size (41953, 6)\n",
      "Training RandomForestClassifier() completed in 53.94558095932007 secs (score=0.80607507250872)\n",
      "Training MLPClassifier() completed in 80.68179965019226 secs (score=0.5896625130776989)\n",
      "predicting df of size (3005, 5), made (3005,)\n",
      "Report of S8: {'2': {'precision': 0.7137809187279152, 'recall': 0.9044776119402985, 'f1-score': 0.7978933508887425, 'support': 670}, '3': {'precision': 0.9703153988868275, 'recall': 0.89593147751606, 'f1-score': 0.931641059897573, 'support': 2335}, 'accuracy': 0.8978369384359401, 'macro avg': {'precision': 0.8420481588073714, 'recall': 0.9002045447281792, 'f1-score': 0.8647672053931577, 'support': 3005}, 'weighted avg': {'precision': 0.9131180272706972, 'recall': 0.8978369384359401, 'f1-score': 0.9018204392533412, 'support': 3005}}\n",
      "Testing S9\n",
      "test #S9 skipped\n",
      "\n",
      "input of size (41968, 6)\n",
      "Training RandomForestClassifier() completed in 53.17934989929199 secs (score=0.8263158232876083)\n",
      "Training MLPClassifier() completed in 64.01237964630127 secs (score=0.5690492431252364)\n",
      "predicting df of size (2990, 5), made (2990,)\n",
      "Report of S9: {'2': {'precision': 0.3893905191873589, 'recall': 0.5348837209302325, 'f1-score': 0.4506858262573481, 'support': 645}, '3': {'precision': 0.8574144486692015, 'recall': 0.7692963752665245, 'f1-score': 0.8109687570240502, 'support': 2345}, 'accuracy': 0.7187290969899666, 'macro avg': {'precision': 0.6234024839282801, 'recall': 0.6520900480983784, 'f1-score': 0.6308272916406992, 'support': 2990}, 'weighted avg': {'precision': 0.7564527648846567, 'recall': 0.7187290969899666, 'f1-score': 0.733248860587755, 'support': 2990}}\n",
      "Testing S10\n",
      "test #S10 skipped\n",
      "\n",
      "input of size (41885, 6)\n",
      "Training RandomForestClassifier() completed in 49.19394063949585 secs (score=0.8072895017023012)\n",
      "Training MLPClassifier() completed in 40.63723683357239 secs (score=0.5477828315678714)\n",
      "predicting df of size (3073, 5), made (3073,)\n",
      "Report of S10: {'2': {'precision': 0.7775061124694377, 'recall': 0.8772413793103448, 'f1-score': 0.8243681140635126, 'support': 725}, '3': {'precision': 0.9605321507760533, 'recall': 0.9224872231686542, 'f1-score': 0.9411253530306322, 'support': 2348}, 'accuracy': 0.9118125610152945, 'macro avg': {'precision': 0.8690191316227455, 'recall': 0.8998643012394996, 'f1-score': 0.8827467335470724, 'support': 3073}, 'weighted avg': {'precision': 0.9173515852790484, 'recall': 0.9118125610152945, 'f1-score': 0.9135793073908138, 'support': 3073}}\n",
      "Testing S11\n",
      "test #S11 skipped\n",
      "\n",
      "input of size (41939, 6)\n",
      "Training RandomForestClassifier() completed in 49.50080728530884 secs (score=0.831830313007526)\n",
      "Training MLPClassifier() completed in 50.72052454948425 secs (score=0.5574618594138011)\n",
      "predicting df of size (3019, 5), made (3019,)\n",
      "Report of S11: {'2': {'precision': 0.46600741656365885, 'recall': 0.5544117647058824, 'f1-score': 0.5063801208865011, 'support': 680}, '3': {'precision': 0.86289592760181, 'recall': 0.8153056861906798, 'f1-score': 0.8384260276983952, 'support': 2339}, 'accuracy': 0.7565419012918185, 'macro avg': {'precision': 0.6644516720827345, 'recall': 0.6848587254482811, 'f1-score': 0.6724030742924482, 'support': 3019}, 'weighted avg': {'precision': 0.773500701531607, 'recall': 0.7565419012918185, 'f1-score': 0.7636359592545104, 'support': 3019}}\n",
      "Testing S13\n",
      "test #S13 skipped\n",
      "\n",
      "input of size (41937, 6)\n",
      "Training RandomForestClassifier() completed in 48.39837408065796 secs (score=0.8077587163537758)\n",
      "Training MLPClassifier() completed in 55.35606837272644 secs (score=0.5596979768565802)\n",
      "predicting df of size (3021, 5), made (3021,)\n",
      "Report of S13: {'2': {'precision': 0.7024691358024692, 'recall': 0.8569277108433735, 'f1-score': 0.7720488466757124, 'support': 664}, '3': {'precision': 0.9570330167345092, 'recall': 0.8977513788714467, 'f1-score': 0.9264448336252189, 'support': 2357}, 'accuracy': 0.8887785501489573, 'macro avg': {'precision': 0.8297510762684892, 'recall': 0.8773395448574102, 'f1-score': 0.8492468401504656, 'support': 3021}, 'weighted avg': {'precision': 0.9010812070890692, 'recall': 0.8887785501489573, 'f1-score': 0.8925094031934175, 'support': 3021}}\n",
      "Testing S14\n",
      "test #S14 skipped\n",
      "\n",
      "input of size (41937, 6)\n",
      "Training RandomForestClassifier() completed in 48.75162196159363 secs (score=0.8235426110791085)\n",
      "Training MLPClassifier() completed in 48.69660568237305 secs (score=0.5481913886781717)\n",
      "predicting df of size (3021, 5), made (3021,)\n",
      "Report of S14: {'2': {'precision': 0.6002460024600246, 'recall': 0.7229629629629629, 'f1-score': 0.6559139784946236, 'support': 675}, '3': {'precision': 0.9153079710144928, 'recall': 0.861466325660699, 'f1-score': 0.8875713658322354, 'support': 2346}, 'accuracy': 0.8305196954650778, 'macro avg': {'precision': 0.7577769867372587, 'recall': 0.792214644311831, 'f1-score': 0.7717426721634295, 'support': 3021}, 'weighted avg': {'precision': 0.8449118012778936, 'recall': 0.8305196954650778, 'f1-score': 0.8358107777975158, 'support': 3021}}\n",
      "Testing S15\n",
      "test #S15 skipped\n",
      "\n",
      "input of size (41931, 6)\n",
      "Training RandomForestClassifier() completed in 49.67634892463684 secs (score=0.8048664830675982)\n",
      "Training MLPClassifier() completed in 87.33770942687988 secs (score=0.5506953647174019)\n",
      "predicting df of size (3027, 5), made (3027,)\n",
      "Report of S15: {'2': {'precision': 0.7645687645687645, 'recall': 0.956268221574344, 'f1-score': 0.8497409326424871, 'support': 686}, '3': {'precision': 0.9861687413554634, 'recall': 0.9137120888509184, 'f1-score': 0.9485587583148558, 'support': 2341}, 'accuracy': 0.9233564585398084, 'macro avg': {'precision': 0.8753687529621139, 'recall': 0.9349901552126312, 'f1-score': 0.8991498454786715, 'support': 3027}, 'weighted avg': {'precision': 0.9359481982184711, 'recall': 0.9233564585398084, 'f1-score': 0.9261639686183759, 'support': 3027}}\n",
      "Testing S16\n",
      "test #S16 skipped\n",
      "\n",
      "input of size (41945, 6)\n",
      "Training RandomForestClassifier() completed in 69.6068787574768 secs (score=0.8203293927129579)\n",
      "Training MLPClassifier() completed in 68.34525203704834 secs (score=0.5121606596260928)\n",
      "predicting df of size (3013, 5), made (3013,)\n",
      "Report of S16: {'2': {'precision': 0.6277712952158693, 'recall': 0.799405646359584, 'f1-score': 0.7032679738562091, 'support': 673}, '3': {'precision': 0.9373840445269017, 'recall': 0.8636752136752137, 'f1-score': 0.8990213523131673, 'support': 2340}, 'accuracy': 0.8493196150016594, 'macro avg': {'precision': 0.7825776698713856, 'recall': 0.8315404300173989, 'f1-score': 0.8011446630846881, 'support': 3013}, 'weighted avg': {'precision': 0.868227263814547, 'recall': 0.8493196150016594, 'f1-score': 0.8552968173972919, 'support': 3013}}\n",
      "Testing S17\n",
      "test #S17 skipped\n",
      "\n",
      "input of size (41951, 6)\n",
      "Training RandomForestClassifier() completed in 54.125136613845825 secs (score=0.802983847248403)\n",
      "Training MLPClassifier() completed in 61.27843379974365 secs (score=0.6403416358951994)\n",
      "predicting df of size (3007, 5), made (3007,)\n",
      "Report of S17: {'2': {'precision': 0.6605616605616605, 'recall': 0.7482710926694329, 'f1-score': 0.701686121919585, 'support': 723}, '3': {'precision': 0.916819012797075, 'recall': 0.8782837127845884, 'f1-score': 0.8971377459749552, 'support': 2284}, 'accuracy': 0.8470236115729963, 'macro avg': {'precision': 0.7886903366793678, 'recall': 0.8132774027270107, 'f1-score': 0.7994119339472701, 'support': 3007}, 'weighted avg': {'precision': 0.855204757504024, 'recall': 0.8470236115729963, 'f1-score': 0.8501435576836242, 'support': 3007}}\n"
     ]
    }
   ],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.neural_network import MLPClassifier\n",
    "from classics import WESADTrainer\n",
    "import pandas as pd\n",
    "\n",
    "subjects = {i for i in range(2, 18)}.difference({12})\n",
    "trainer = WESADTrainer({\n",
    "    RandomForestClassifier: \n",
    "        {'n_estimators': [100], 'min_samples_leaf': [1]},\n",
    "    MLPClassifier:\n",
    "        {},\n",
    "    \n",
    "    }, sensor='chest_Resp', subjects=subjects, data_prefix=\"svd\", classes=[2])\n",
    "\n",
    "reports = trainer.predict_all(verbose=3)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1: {'precision': 0, 'recall': 0, 'f1-score': 0}\n",
      "2: {'precision': 0.6963993299941651, 'recall': 0.7224182369702018, 'f1-score': 0.6893291553323447}\n",
      "3: {'precision': 0.9210738409342901, 'recall': 0.8945740858623811, 'f1-score': 0.9062676559483119}\n",
      "4: {'precision': 0, 'recall': 0, 'f1-score': 0}\n",
      "weighted avg: {'precision': 0.8711524471000265, 'recall': 0.8568923181308491, 'f1-score': 0.8584260810631972}\n",
      "macro avg: {'precision': 0.8087365854642274, 'recall': 0.8084961614162914, 'f1-score': 0.7977984056403286}\n",
      "accuracy: 0.8568923181308491\n"
     ]
    }
   ],
   "source": [
    "for item in reports:\n",
    "    print(f\"{item}: {reports[item]}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[93mTesting 2\u001b[0m\n",
      "Dataset with len of 499\n",
      "Dataset with len of 48\n",
      "Dataset with len of 201\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "GPU available: False, used: False\n",
      "GPU available: False, used: False\n",
      "TPU available: False, using: 0 TPU cores\n",
      "TPU available: False, using: 0 TPU cores\n",
      "IPU available: False, using: 0 IPUs\n",
      "IPU available: False, using: 0 IPUs\n",
      "HPU available: False, using: 0 HPUs\n",
      "HPU available: False, using: 0 HPUs\n",
      "c:\\Users\\Elham moin\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\pytorch_lightning\\callbacks\\model_checkpoint.py:653: Checkpoint directory ./log\\WESAD-BIOT-0.001-64-200-200-100\\checkpoints exists and is not empty.\n",
      "\n",
      "  | Name  | Type           | Params\n",
      "-----------------------------------------\n",
      "0 | model | BIOTClassifier | 3.2 M \n",
      "-----------------------------------------\n",
      "3.2 M     Trainable params\n",
      "16        Non-trainable params\n",
      "3.2 M     Total params\n",
      "12.746    Total estimated model params size (MB)\n",
      "\n",
      "  | Name  | Type           | Params\n",
      "-----------------------------------------\n",
      "0 | model | BIOTClassifier | 3.2 M \n",
      "-----------------------------------------\n",
      "3.2 M     Trainable params\n",
      "16        Non-trainable params\n",
      "3.2 M     Total params\n",
      "12.746    Total estimated model params size (MB)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sanity Checking DataLoader 0: 100%|██████████| 2/2 [00:13<00:00,  0.14it/s]{'f1': 0.10000000000000002, 'pr_auc': 0.17676846214122105, 'roc_auc': 0.2908163265306123, 'recall': 0.1, 'accuracy': 0.578125, 'balanced_accuracy': 0.4122448979591837}\n",
      "                                                                           \r"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\Users\\Elham moin\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\pytorch_lightning\\loops\\fit_loop.py:298: The number of training batches (7) is smaller than the logging interval Trainer(log_every_n_steps=50). Set a lower value for log_every_n_steps if you want to see logs for the training epoch.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 0: 100%|██████████| 7/7 [02:13<00:00,  0.05it/s, v_num=-100]{'f1': 0.2236842105263158, 'pr_auc': 0.3034311558424342, 'roc_auc': 0.5389016018306636, 'recall': 0.2236842105263158, 'accuracy': 0.6413373860182371, 'balanced_accuracy': 0.4952413147493239}\n",
      "Epoch 1: 100%|██████████| 7/7 [01:56<00:00,  0.06it/s, v_num=-100]{'f1': 0.2786885245901639, 'pr_auc': 0.36672823690115713, 'roc_auc': 0.6197163291546127, 'recall': 0.2786885245901639, 'accuracy': 0.6679245283018868, 'balanced_accuracy': 0.53150112504018}\n",
      "Epoch 2: 100%|██████████| 7/7 [02:06<00:00,  0.06it/s, v_num=-100]{'f1': 0.3392857142857143, 'pr_auc': 0.43022341567249966, 'roc_auc': 0.6740040598832783, 'recall': 0.3392857142857143, 'accuracy': 0.6963064295485636, 'balanced_accuracy': 0.5710638162902817}\n",
      "Epoch 3: 100%|██████████| 7/7 [02:02<00:00,  0.06it/s, v_num=-100]{'f1': 0.397196261682243, 'pr_auc': 0.48331716345762366, 'roc_auc': 0.7141918100643011, 'recall': 0.397196261682243, 'accuracy': 0.723175965665236, 'balanced_accuracy': 0.6087652617603416}\n",
      "Epoch 4: 100%|██████████| 7/7 [02:04<00:00,  0.06it/s, v_num=-100]{'f1': 0.43846153846153846, 'pr_auc': 0.5321323581321211, 'roc_auc': 0.7437263194995154, 'recall': 0.43846153846153846, 'accuracy': 0.7422771403353927, 'balanced_accuracy': 0.635611067054366}\n",
      "Epoch 5: 100%|██████████| 7/7 [02:04<00:00,  0.06it/s, v_num=-100]{'f1': 0.46078431372549017, 'pr_auc': 0.5662342087093118, 'roc_auc': 0.7633039597161821, 'recall': 0.46078431372549017, 'accuracy': 0.7526236881559221, 'balanced_accuracy': 0.6501392385748074}\n",
      "Epoch 6: 100%|██████████| 7/7 [02:03<00:00,  0.06it/s, v_num=-100]{'f1': 0.48579545454545453, 'pr_auc': 0.5915832519616016, 'roc_auc': 0.7809594251901946, 'recall': 0.48579545454545453, 'accuracy': 0.7641693811074919, 'balanced_accuracy': 0.6663973046184585}\n",
      "Epoch 7: 100%|██████████| 7/7 [04:00<00:00,  0.03it/s, v_num=-100]{'f1': 0.5025125628140703, 'pr_auc': 0.6100647144615171, 'roc_auc': 0.7979020663857403, 'recall': 0.5025125628140703, 'accuracy': 0.771889400921659, 'balanced_accuracy': 0.6772652500169006}\n",
      "Epoch 8: 100%|██████████| 7/7 [04:33<00:00,  0.03it/s, v_num=-100]{'f1': 0.5315315315315315, 'pr_auc': 0.642379099991537, 'roc_auc': 0.8122409080212162, 'recall': 0.5315315315315315, 'accuracy': 0.785234899328859, 'balanced_accuracy': 0.696107359871593}\n",
      "Epoch 9: 100%|██████████| 7/7 [02:52<00:00,  0.04it/s, v_num=-100]{'f1': 0.5530612244897959, 'pr_auc': 0.6609152462354606, 'roc_auc': 0.8227499009312462, 'recall': 0.5530612244897959, 'accuracy': 0.7951356407857811, 'balanced_accuracy': 0.7100864374876164}\n",
      "Epoch 9: 100%|██████████| 7/7 [03:22<00:00,  0.03it/s, v_num=-100]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "`Trainer.fit` stopped: `max_epochs=10` reached.\n",
      "`Trainer.fit` stopped: `max_epochs=10` reached.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 9: 100%|██████████| 7/7 [03:23<00:00,  0.03it/s, v_num=-100]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Restoring states from the checkpoint path at ./log\\WESAD-BIOT-0.001-64-200-200-100\\checkpoints\\epoch=9-step=70.ckpt\n",
      "Restoring states from the checkpoint path at ./log\\WESAD-BIOT-0.001-64-200-200-100\\checkpoints\\epoch=9-step=70.ckpt\n"
     ]
    },
    {
     "ename": "AttributeError",
     "evalue": "module 'pytorch_lightning' has no attribute 'utilities'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mAttributeError\u001b[0m                            Traceback (most recent call last)",
      "Input \u001b[1;32mIn [3]\u001b[0m, in \u001b[0;36m<cell line: 5>\u001b[1;34m()\u001b[0m\n\u001b[0;32m      2\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mbiotOnWesad\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m Main\n\u001b[0;32m      4\u001b[0m runner \u001b[38;5;241m=\u001b[39m Main(tests\u001b[38;5;241m=\u001b[39m[\u001b[38;5;241m2\u001b[39m, \u001b[38;5;241m12\u001b[39m], epochs\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m10\u001b[39m)\n\u001b[1;32m----> 5\u001b[0m \u001b[43mrunner\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgo\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[1;32mc:\\Users\\Elham moin\\Desktop\\uniVer\\bachProj\\biotOnWesad.py:46\u001b[0m, in \u001b[0;36mMain.go\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m     44\u001b[0m         \u001b[38;5;28msetattr\u001b[39m(args, key, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mkwargs[key])\n\u001b[0;32m     45\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmodel \u001b[38;5;241m=\u001b[39m Supervised(args\u001b[38;5;241m=\u001b[39margs)\n\u001b[1;32m---> 46\u001b[0m results[test] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmodel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msupervised_go\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m     47\u001b[0m total_time \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime() \u001b[38;5;241m-\u001b[39m start_time\n\u001b[0;32m     48\u001b[0m results[test][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtime\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m total_time\n",
      "File \u001b[1;32mc:\\Users\\Elham moin\\Desktop\\uniVer\\bachProj\\biot\\BIOT\\run_binary_supervised.py:487\u001b[0m, in \u001b[0;36mSupervised.supervised_go\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m    482\u001b[0m trainer\u001b[38;5;241m.\u001b[39mfit(\n\u001b[0;32m    483\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlightning_model, train_dataloaders\u001b[38;5;241m=\u001b[39mtrain_loader, val_dataloaders\u001b[38;5;241m=\u001b[39mval_loader\n\u001b[0;32m    484\u001b[0m )\n\u001b[0;32m    486\u001b[0m \u001b[38;5;66;03m# test the model\u001b[39;00m\n\u001b[1;32m--> 487\u001b[0m pretrain_result \u001b[38;5;241m=\u001b[39m \u001b[43mtrainer\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtest\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m    488\u001b[0m \u001b[43m    \u001b[49m\u001b[43mmodel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlightning_model\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mckpt_path\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mbest\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdataloaders\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtest_loader\u001b[49m\n\u001b[0;32m    489\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m[\u001b[38;5;241m0\u001b[39m]\n\u001b[0;32m    490\u001b[0m \u001b[38;5;28mprint\u001b[39m(pretrain_result)\n\u001b[0;32m    491\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m pretrain_result\n",
      "File \u001b[1;32mc:\\Users\\Elham moin\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\pytorch_lightning\\trainer\\trainer.py:754\u001b[0m, in \u001b[0;36mTrainer.test\u001b[1;34m(self, model, dataloaders, ckpt_path, verbose, datamodule)\u001b[0m\n\u001b[0;32m    752\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstate\u001b[38;5;241m.\u001b[39mstatus \u001b[38;5;241m=\u001b[39m TrainerStatus\u001b[38;5;241m.\u001b[39mRUNNING\n\u001b[0;32m    753\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtesting \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[1;32m--> 754\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mcall\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_and_handle_interrupt\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m    755\u001b[0m \u001b[43m    \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_test_impl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdataloaders\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mckpt_path\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mverbose\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdatamodule\u001b[49m\n\u001b[0;32m    756\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[1;32mc:\\Users\\Elham moin\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\pytorch_lightning\\trainer\\call.py:44\u001b[0m, in \u001b[0;36m_call_and_handle_interrupt\u001b[1;34m(trainer, trainer_fn, *args, **kwargs)\u001b[0m\n\u001b[0;32m     42\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m trainer\u001b[38;5;241m.\u001b[39mstrategy\u001b[38;5;241m.\u001b[39mlauncher \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m     43\u001b[0m         \u001b[38;5;28;01mreturn\u001b[39;00m trainer\u001b[38;5;241m.\u001b[39mstrategy\u001b[38;5;241m.\u001b[39mlauncher\u001b[38;5;241m.\u001b[39mlaunch(trainer_fn, \u001b[38;5;241m*\u001b[39margs, trainer\u001b[38;5;241m=\u001b[39mtrainer, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[1;32m---> 44\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m trainer_fn(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m     46\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m _TunerExitException:\n\u001b[0;32m     47\u001b[0m     _call_teardown_hook(trainer)\n",
      "File \u001b[1;32mc:\\Users\\Elham moin\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\pytorch_lightning\\trainer\\trainer.py:794\u001b[0m, in \u001b[0;36mTrainer._test_impl\u001b[1;34m(self, model, dataloaders, ckpt_path, verbose, datamodule)\u001b[0m\n\u001b[0;32m    790\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstate\u001b[38;5;241m.\u001b[39mfn \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m    791\u001b[0m ckpt_path \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_checkpoint_connector\u001b[38;5;241m.\u001b[39m_select_ckpt_path(\n\u001b[0;32m    792\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstate\u001b[38;5;241m.\u001b[39mfn, ckpt_path, model_provided\u001b[38;5;241m=\u001b[39mmodel_provided, model_connected\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlightning_module \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m    793\u001b[0m )\n\u001b[1;32m--> 794\u001b[0m results \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_run\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mckpt_path\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mckpt_path\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m    795\u001b[0m \u001b[38;5;66;03m# remove the tensors from the test results\u001b[39;00m\n\u001b[0;32m    796\u001b[0m results \u001b[38;5;241m=\u001b[39m convert_tensors_to_scalars(results)\n",
      "File \u001b[1;32mc:\\Users\\Elham moin\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\pytorch_lightning\\trainer\\trainer.py:956\u001b[0m, in \u001b[0;36mTrainer._run\u001b[1;34m(self, model, ckpt_path)\u001b[0m\n\u001b[0;32m    954\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstrategy\u001b[38;5;241m.\u001b[39mrestore_checkpoint_after_setup:\n\u001b[0;32m    955\u001b[0m     log\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m: restoring module and callbacks from checkpoint path: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mckpt_path\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m--> 956\u001b[0m     \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_checkpoint_connector\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_restore_modules_and_callbacks\u001b[49m\u001b[43m(\u001b[49m\u001b[43mckpt_path\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m    958\u001b[0m \u001b[38;5;66;03m# reset logger connector\u001b[39;00m\n\u001b[0;32m    959\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_logger_connector\u001b[38;5;241m.\u001b[39mreset_results()\n",
      "File \u001b[1;32mc:\\Users\\Elham moin\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\pytorch_lightning\\trainer\\connectors\\checkpoint_connector.py:397\u001b[0m, in \u001b[0;36m_CheckpointConnector._restore_modules_and_callbacks\u001b[1;34m(self, checkpoint_path)\u001b[0m\n\u001b[0;32m    395\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_restore_modules_and_callbacks\u001b[39m(\u001b[38;5;28mself\u001b[39m, checkpoint_path: Optional[_PATH] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m    396\u001b[0m     \u001b[38;5;66;03m# restore modules after setup\u001b[39;00m\n\u001b[1;32m--> 397\u001b[0m     \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mresume_start\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcheckpoint_path\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m    398\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mrestore_model()\n\u001b[0;32m    399\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mrestore_datamodule()\n",
      "File \u001b[1;32mc:\\Users\\Elham moin\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\pytorch_lightning\\trainer\\connectors\\checkpoint_connector.py:78\u001b[0m, in \u001b[0;36m_CheckpointConnector.resume_start\u001b[1;34m(self, checkpoint_path)\u001b[0m\n\u001b[0;32m     75\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[0;32m     77\u001b[0m rank_zero_info(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mRestoring states from the checkpoint path at \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mcheckpoint_path\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m---> 78\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m pl_legacy_patch():\n\u001b[0;32m     79\u001b[0m     loaded_checkpoint \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtrainer\u001b[38;5;241m.\u001b[39mstrategy\u001b[38;5;241m.\u001b[39mload_checkpoint(checkpoint_path)\n\u001b[0;32m     80\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_loaded_checkpoint \u001b[38;5;241m=\u001b[39m _pl_migrate_checkpoint(loaded_checkpoint, checkpoint_path)\n",
      "File \u001b[1;32mc:\\Users\\Elham moin\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\pytorch_lightning\\utilities\\migration\\utils.py:107\u001b[0m, in \u001b[0;36mpl_legacy_patch.__enter__\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m    105\u001b[0m \u001b[38;5;66;03m# `_gpus_arg_default` used to be imported from these locations\u001b[39;00m\n\u001b[0;32m    106\u001b[0m legacy_argparse_module\u001b[38;5;241m.\u001b[39m_gpus_arg_default \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mlambda\u001b[39;00m x: x\n\u001b[1;32m--> 107\u001b[0m \u001b[43mpl\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mutilities\u001b[49m\u001b[38;5;241m.\u001b[39margparse\u001b[38;5;241m.\u001b[39m_gpus_arg_default \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mlambda\u001b[39;00m x: x\n\u001b[0;32m    109\u001b[0m \u001b[38;5;66;03m# `_FaultTolerantMode` was removed from the enums\u001b[39;00m\n\u001b[0;32m    110\u001b[0m \u001b[38;5;28;01mclass\u001b[39;00m \u001b[38;5;21;01m_FaultTolerantMode\u001b[39;00m(LightningEnum):\n",
      "\u001b[1;31mAttributeError\u001b[0m: module 'pytorch_lightning' has no attribute 'utilities'"
     ]
    }
   ],
   "source": [
    "# from biot.BIOT.run_binary_supervised import supervised\n",
    "from biotOnWesad import Main\n",
    "\n",
    "runner = Main(tests=[2, 12], epochs=10)\n",
    "runner.go()\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pickle\n",
    "import torch\n",
    "\n",
    "with open(\"WESAD_Biot_Xy.pickle\", \"rb\") as file:\n",
    "    X, Y = pickle.load(file)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([1, 9616800])\n",
      "torch.Size([1, 200])\n",
      "tensor(45) tensor(155)\n"
     ]
    }
   ],
   "source": [
    "print(Y.shape)\n",
    "Y2 = Y[:, :9600000].reshape((1, -1, 200 * 240)).mode(2).values\n",
    "print(Y2.shape)\n",
    "print((Y2 == 2).sum(), (Y2 != 2).sum())\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'test_acc': 0.8047619142702646, 'test_bacc': 0.7708333304950169, 'test_pr_auc': 0.9007936503205979, 'test_auroc': 0.952380950961794, 'time': 882.740820475987}\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[93mWould you like to continue: \u001b[0m\n"
     ]
    }
   ],
   "source": [
    "import json\n",
    "with open(\"biot_result_2024_Jun_15_14.json\") as file:\n",
    "    results = json.load(file)\n",
    "\n",
    "total = dict.fromkeys(results['2'], 0)\n",
    "for subj in results.keys():\n",
    "    result = results[subj]\n",
    "    for key in result.keys():\n",
    "        total[key] += result[key] / len(results)\n",
    "\n",
    "print(total)\n",
    "\n",
    "accs = [results[subj]['test_acc'] for subj in results.keys()]\n",
    "baccs = [results[subj]['test_bacc'] for subj in results.keys()]\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "plt.plot(accs)\n",
    "plt.plot(baccs)\n",
    "plt.show()\n",
    "\n",
    "print(\"\\033[93mWould you like to continue: \\033[0m\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
